goto exit;
if (!PyArg_ParseTupleAndKeywords(args, kwds, arg_spec, kwd_spec))
goto exit;
+again:
Py_BEGIN_ALLOW_THREADS
xsval = xs_read_watch(xh, &num);
Py_END_ALLOW_THREADS
break;
}
if (i == PyList_Size(xsh->watches)) {
- PyErr_SetString(PyExc_RuntimeError, "invalid token");
- goto exit;
+ /* We do not have a registered watch for the one that has just fired.
+ Ignore this -- a watch that has been recently deregistered can still
+ have watches in transit. This is a blocking method, so go back to
+ read again.
+ */
+ free(xsval);
+ goto again;
}
/* Create tuple (path, token). */
val = Py_BuildValue("(sO)", xsval[XS_WATCH_PATH], token);
from xen.lowlevel import xs
from xen.xend.xenstore.xsutil import xshandle
+from xen.xend.XendLogging import log
+
+
class xswatch:
watchThread = None
while True:
try:
we = cls.xs.read_watch()
- except RuntimeError, ex:
- print ex
- raise
- watch = we[1]
- watch.fn(*watch.args, **watch.kwargs)
+ watch = we[1]
+ watch.fn(*watch.args, **watch.kwargs)
+ except:
+ log.exception("read_watch failed")
+ # Ignore this exception -- there's no point throwing it
+ # further on because that will just kill the watcher thread,
+ # which achieves nothing.
+
watchMain = classmethod(watchMain)